home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-ROM Collection / Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso / auge4000 / 46 / lib / extra / getfnl.c next >
C/C++ Source or Header  |  1990-06-20  |  2KB  |  97 lines

  1.  
  2. /*
  3.  *  GETFNL.C
  4.  *
  5.  *  (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  6.  */
  7.  
  8. #include <exec/types.h>
  9. #include <libraries/dos.h>
  10. #include <stdlib.h>
  11. #include <errno.h>
  12.  
  13. typedef struct FileInfoBlock FIB;
  14.  
  15. extern void *_ParseWild();
  16.  
  17. int
  18. getfnl(pat, buf, bufSize, attr)
  19. const char *pat;
  20. char *buf;
  21. size_t bufSize;
  22. int attr;        /*  0 = files, 1 = files & dirs */
  23. {
  24.     BPTR lock;
  25.     FIB *fib = malloc(sizeof(FIB));
  26.     int r = -1;
  27.     void *wildNode = NULL;
  28.  
  29.     errno = 0;
  30.  
  31.     _SetWildStack(2048);
  32.  
  33.     --bufSize;        /*    final \0 at end */
  34.  
  35.     if (fib) {
  36.     const char *ptr;
  37.     BPTR lock;
  38.  
  39.     for (ptr = pat + strlen(pat); ptr >= pat; --ptr) {
  40.         if (*ptr == '/' || *ptr == ':')
  41.         break;
  42.     }
  43.     ++ptr;        /*    points to just after the last / or :,    */
  44.             /*    or to the beginning if no / or :    */
  45.     /*
  46.      *  can't modify a const string !
  47.      */
  48.     wildNode = _ParseWild(ptr, strlen(ptr));
  49.  
  50.     {
  51.         short len = ptr - pat;
  52.         char *hdr = malloc(len + 1);
  53.         strncpy(hdr, pat, len);
  54.         hdr[len] = 0;
  55.  
  56.         lock = Lock(hdr, SHARED_LOCK);
  57.         free(hdr);
  58.     }
  59.  
  60.     if (lock) {
  61.         if (Examine(lock, fib)) {
  62.         r = 0;
  63.         while (ExNext(lock, fib)) {
  64.             short len;
  65.             short prelen = ptr - pat;
  66.  
  67.             if (attr == 0 && fib->fib_DirEntryType > 0)
  68.             continue;
  69.             if (_CompWild(fib->fib_FileName, wildNode, NULL) < 0)
  70.             continue;
  71.             if (errno)
  72.             break;
  73.             len = strlen(fib->fib_FileName) + prelen + 1;
  74.             if (len > bufSize) {
  75.             r = -1;
  76.             break;
  77.             }
  78.             strncpy(buf, pat, prelen);
  79.             strcpy(buf + prelen, fib->fib_FileName);
  80.             buf += len;
  81.             bufSize -= len;
  82.             ++r;
  83.         }
  84.         }
  85.         UnLock(lock);
  86.     }
  87.     free(fib);
  88.     }
  89.     _FreeWild(wildNode);
  90.     if (bufSize > 0)
  91.     *buf = 0;
  92.     if (errno)
  93.     r = -1;
  94.     return(r);
  95. }
  96.  
  97.